1 module tests.student;
2 
3 import db_constraints;
4 
5 version(unittest)
6 class Student
7 {
8 private:
9     string _cName;
10     int _nNumClasses;
11 public:
12     @PrimaryKeyColumn @NotNull
13     @property string cName() const nothrow pure @safe @nogc
14     {
15         return _cName;
16     }
17     @CheckConstraint!("a.length < 13")
18     @property void cName(immutable(char)[] value)
19     {
20         setter(_cName, value);
21     }
22     @property int nNumClasses() const nothrow pure @safe @nogc
23     {
24         return _nNumClasses;
25     }
26     @UniqueConstraintColumn!("uc_Student")
27     @property void nNumClasses(immutable(int) value)
28     {
29         setter(_nNumClasses, value);
30     }
31 
32     this(string pcName, immutable(int) pnNumClasses)
33     {
34 
35         this._cName = pcName;
36         this._nNumClasses = pnNumClasses;
37 
38         initializeKeyedItem();
39     }
40     Student dup() const
41     {
42         return new Student(this._cName, this._nNumClasses);
43     }
44 
45     bool isValid() const nothrow pure @safe @nogc
46     {
47         if (this._cName.length > 13)
48         {
49             return false;
50         }
51         return true;
52     }
53     void printInfo()
54     {
55         import std.stdio: writeln;
56         writeln("cName = ", cName,
57                 ", nNumClasses = ", nNumClasses);
58     }
59     override string toString()
60     {
61         return this.cName;
62     }
63     override int opCmp(Object o) const
64     {
65         if (typeid(this) != typeid(o))
66         {
67             return typeid(this).opCmp(typeid(o));
68         }
69         auto rhs = cast(immutable Student)o;
70         return this.key.opCmp(rhs.key);
71     }
72     override bool opEquals(Object o) const pure nothrow @nogc
73     {
74         auto rhs = cast(immutable Student)o;
75         return (rhs !is null && this.key == rhs.key);
76     }
77     mixin KeyedItem!();
78 }
79 
80 unittest
81 {
82     auto i = new Student("Tom", 8);
83     assert(i.isValid);
84 }
85 ///
86 unittest
87 {
88     auto i = new Student("Tom", 8);
89     assert(!i.containsChanges);
90     i.cName = "What";
91     assert(i.containsChanges);
92     i.markAsSaved();
93     assert(!i.containsChanges);
94 }
95 unittest
96 {
97     auto i = new Student("Tom", 0);
98     auto j = new Student("Jake", 7);
99     assert(i != j);
100     assert(i > j);
101 }
102 unittest
103 {
104     auto i = Student.PrimaryKey("Jean");
105     assert(i.cName == "Jean");
106     assert(typeid(i.cName) == typeid(string));
107     auto j = new Student("Tom", 8);
108     assert(i != j.key);
109     j.cName = "Jean";
110     assert(i == j.key);
111 }
112 unittest
113 {
114     auto i = new Student("Tom", 0);
115     auto j = new Student("Tom", 7);
116     assert(i == j);
117 }
118 unittest
119 {
120     auto i = new Student("Tom", 0);
121     auto j = new Student("Jake", 0);
122     assert(i.key != j.key);
123     assert(i != j);
124     assert(i.uc_Student_key == j.uc_Student_key);
125 }
126 
127 
128 version(unittest)
129 alias Students = BaseKeyedCollection!(Student);
130 
131 unittest
132 {
133     auto i = new Students(new Student("Tom", 7));
134     assert(i.length == 1);
135 }
136 unittest
137 {
138     auto i = new Students(new Student("Tom", 7));
139     assert(!i.containsChanges);
140     i ~= new Student("Jon", 8);
141     assert(i.length == 2);
142     assert(i.containsChanges);
143     i.markAsSaved();
144     assert(!i.containsChanges);
145 }
146 unittest
147 {
148     auto i = new Students(new Student("Tom", 7));
149     auto j = new Student("Tom", 8);
150     assert(i[cast(Student.PrimaryKey)"Tom"] == j);
151     auto k = new Student("Jake", 5);
152     assert(i[Student.PrimaryKey("Tom")] != k);
153 }
154 
155 unittest
156 {
157     auto i = new Students(new Student("Tom", 7));
158     auto j = new Student("Tom", 8);
159     auto Tom = Student.PrimaryKey("Tom");
160     assert(i[Tom] == j);
161     auto k = new Student("Jake", 5);
162     assert(i[Tom] != k);
163 }
164 
165 unittest
166 {
167     auto i = new Students(new Student("Tom", 7));
168     i ~= new Student("Jake", 5);
169     assert(i.length == 2);
170     auto Tom = Student.PrimaryKey("Tom");
171     assert(Tom in i);
172     auto j = i[Tom];
173     j.cName = "Tommy";
174     assert(i.length == 2);
175     auto Tommy = Student.PrimaryKey("Tommy");
176     assert(Tommy in i);
177     auto k = i[Tommy];
178     auto l = new Student("Tommy", 7);
179     assert(l == k);
180 }
181 
182 unittest
183 {
184     auto i = new Students(new Student("Tom", 7));
185     i ~= new Student("Jake", 5);
186     foreach(mykey, myvalue; i)
187     {
188         assert(i[mykey] == myvalue);
189     }
190     auto j = new Student("Jake", 5);
191     assert(i.contains(j.key));
192     assert(i.contains(j));
193     assert(j in i);
194 
195     import std.exception : assertThrown;
196     assertThrown!UniqueConstraintException(i ~= j);
197 }
198 
199 unittest
200 {
201     auto i = new Students(new Student("Tom", 7));
202     auto jake = new Student("Jake", 7);
203     import std.exception : assertThrown;
204     assertThrown!UniqueConstraintException(i.add(jake));
205     jake.nNumClasses = 5;
206     i.add(jake);
207     assertThrown!UniqueConstraintException(i["Jake"].nNumClasses = 7);
208 }
209 
210 unittest
211 {
212     auto i = new Students(new Student("Tom", 7));
213     auto jake = new Student("Jake", 7);
214     import std.exception : assertThrown, assertNotThrown;
215     assertThrown!UniqueConstraintException(i.add(jake));
216     jake.nNumClasses = 5;
217     i.add(jake);
218     assertNotThrown!UniqueConstraintException(i["Jake"].nNumClasses = 6);
219     assertThrown!KeyedException(i["Sup"].nNumClasses = 9);
220 }
221 
222 unittest
223 {
224     import std.exception : assertThrown, assertNotThrown;
225 
226     auto tom1 = new Student("Tom", 7);
227     auto tom2 = new Student("Tom", 7);
228     auto i = new Students(tom1);
229     assert(i.length == 1);
230     string j;
231     assert(i.violatesUniqueConstraints(tom2, j));
232     assert(j == "PrimaryKey, uc_Student");
233     assert(!i.violatesUniqueConstraints(tom1));
234     assertNotThrown!UniqueConstraintException(i.add(tom1));
235     assertThrown!UniqueConstraintException(i.add(tom2));
236     assert(i.length == 1);
237     tom2.cName = "James";
238     assertThrown!UniqueConstraintException(i.add(tom2));
239     i.enforceConstraints = Enforce.clusteredUnique;
240     assertNotThrown!UniqueConstraintException(i.add(tom2));
241     assert(i.length == 2);
242     foreach(item; i)
243     {
244         assert(i[item.key] == item);
245     }
246     auto tom3 = new Student("Tom", 2);
247     assertThrown!UniqueConstraintException(i.add(tom3));
248 }